package com.example.lambda.rx03

import org.junit.Test

/**
 * 自己手写RxJava的功能
 * 说明：变换后的参数支持this传递更方便
 * 通过扩展函数T.()支持this，扩展函数内部都支持对this的引用
 *
 * @author zhouronghua
 * @time 2022/3/26 4:26 下午
 */
class RxJavaTest03 {

    @Test
    fun testTxJava() {
        create {
            "AAA"
            "BBB"
        } map {
            12.444
        } consume {
            println("最终结果$this")
        }

        create {
            "aaBB"
        } map {
            this.toString().repeat(2)
        } map {
            this.capitalize()
        } consume {
            println("接收到的结果是 $this")
        }
    }
}

/**
 * 中转站
 * 负责将数据进行上游往下游传递
 * Helper带有一个成员，Item@T。这个item是一个输入参数，一直在更新
 */
class Helper<T>(var Item: T)

/**
 * 直接定义Helper<T>.map的扩展函数
 */
infix fun <T, R> Helper<T>.map(action: T.() -> R): Helper<R> = Helper(action(Item))

/**
 * consume也作为中转站的一个方法
 */
infix fun <T> Helper<T>.consume(action: T.() -> Unit) = action(Item)

/**
 * create(action: () -> R)函数的返回值，通过Lambda表达式推导为Helper(action: () -> R)
 */
fun <R> create(action: () -> R) = Helper(action())